/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servlet;

import java.io.IOException;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import persistencia.*;

/**
 *
 * @author pabloavila
 */
@WebServlet(name="Controller", urlPatterns={"/login", "/logout", "/doAPost", "/doAddUser", "/doEditUser", "/doRemoveUser", "/doManage", "/doShowWall", "/doRemovePost"})
public class Controller extends HttpServlet {

    @EJB
    private PermisosFacadeLocal permisosFacade;
    @EJB
    private UsuariosFacadeLocal usuariosFacade;
    @EJB
    private MensajesFacadeLocal mensajesFacade;
    
    private String redirect = "index.jsp";
    private boolean doRedirect = true;

    @Override
    public void init(){

        // Elementos a inicializar con el servlet

        // Intentamos crear los permisos
        if (permisosFacade.getPermisos("GUEST") == null) permisosFacade.create(new Permisos("GUEST"));
        if (permisosFacade.getPermisos("USER") == null) permisosFacade.create(new Permisos("USER"));
        if (permisosFacade.getPermisos("ADMIN") == null) permisosFacade.create(new Permisos("ADMIN"));

        // Creamos el usuario admin por defecto
        if (usuariosFacade.getUsuario("admin", "ADMIN") == null) usuariosFacade.create(new Usuarios("admin","ADMIN"));

        // Cramos un mensaje a mostrar por defecto
        if (mensajesFacade.count() == 0) mensajesFacade.create(new Mensajes("Este es un mensaje de Bienvenida!!", "admin", 1));


    }
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        String userPath = request.getServletPath();

        HttpSession session = request.getSession(false);
        List<Mensajes> lm;
        List<Usuarios> um;
        /*Usuarios cuser = (Usuarios) session.getAttribute("user");
        String cp = "";
        if (cuser != null)cp = cuser.getPermisos();*/

       // Si hace login
        if (userPath.equals("/login")) {
            // Miramos en la BD que existe el usuario
            String formname = request.getParameter("form_name");
            String formpermission = request.getParameter("usertype");
            Usuarios user = usuariosFacade.getUsuario(formname, formpermission);

            // Si existe, iniciamos sesion
            if (user != null){
                session.setAttribute("user",user);
                session.setAttribute("error",false);
                session.setAttribute("msg","Bienvenido " + user.getNombre());                
                redirect = "doShowWall";
                doRedirect = true;
                request.setAttribute("action", redirect);
            }            
            // Si no existe, mostramos mensaje de error
            else{
                session.setAttribute("user",null);
                session.setAttribute("error",true);
                session.setAttribute("msg","El usuario " + formname + " no existe o no tiene los suficientes permisos");
                redirect = "index.jsp";
                doRedirect = true;
                //request.setAttribute("action", redirect);
            }

        // Si hace logout
        } else if (userPath.equals("/logout")) {
            // Destruir la session etc...
            session.invalidate();
            redirect = "index.jsp";
            doRedirect = true;
            //request.setAttribute("action", redirect);

        // Si escribe un nuevo mensaje en el muro
        } else if (userPath.equals("/doAPost")) {
            // Es asincrono, pero a nosotros nos da igual por ahora
            // Para postear un mensaje, cogemos los parametros
            String t = request.getParameter("texto");
            // Comprobamos que este escrito por un user o un admin
            Usuarios u = (Usuarios) session.getAttribute("user");
            if (u != null && (u.getPermisos().equals("USER") || u.getPermisos().equals("ADMIN"))){
                // Creamos el mensaje
                if (!t.equals("")){
                    // El id del mensaje, sera 1+ del ultimo
                    int numm = mensajesFacade.dimeUltimo() + 1;
                    mensajesFacade.create(new Mensajes(t,u.getNombre(),numm));
                    session.setAttribute("error", false);
                    session.setAttribute("msg", "Mensaje insertado correctamente");
                    redirect = "doShowWall";
                    doRedirect = true;
                    //request.setAttribute("action", redirect);
                }
                else{
                    session.setAttribute("error", true);
                    session.setAttribute("msg", "Por favor, escriba un mensaje no vacio");
                    redirect = "doShowWall";
                    doRedirect = true;
                    //request.setAttribute("action", redirect);
                }                
            }                       

        // Añadir usuario
        } else if (userPath.equals("/doAddUser")) {
            // Los pasos seran: recoger formulario y añadirlo si no existe
            String t = request.getParameter("form_name");
            // Comprobamos que el usuario no exista
            if (!t.equals("") && !usuariosFacade.existe(t)){
                // Lo creamos y lo añadimos
                usuariosFacade.create(new Usuarios(t,"GUEST"));
                // Mensajes y redireccion
                session.setAttribute("error", false);
                session.setAttribute("msg", "Usuario " + t + " creado correctamente");
                redirect = "doManage";
                doRedirect = true;
                //request.setAttribute("action", redirect);
            }else{
                // Si ya existe, mensajes y redireccion
                session.setAttribute("error", true);
                session.setAttribute("msg", "Ha habido un error creando el usuario");
                redirect = "doManage";
                doRedirect = true;
                //request.setAttribute("action", redirect);
            }

        // Editar un usuario, en realidad solo es modificar sus permisos
        } else if (userPath.equals("/doEditUser")) {
            // Recogemos el usuario y los permisos por formulario
            String t = request.getParameter("name");
            String p = request.getParameter("per");
            // Buscamos el usuario en la bd y sus permisos
            Usuarios u;
            if (!t.equals("") && !p.equals("") && ((u = usuariosFacade.getUsuario(t)) != null)){
                // Pues lo editamos
                u.setPermisos(p);
                usuariosFacade.edit(u);
                // Y mostramos los mensajes y la redireccion
                session.setAttribute("error", false);
                session.setAttribute("msg", "Permisos modificados con exito");
                redirect = "doManage";
                doRedirect = true;
                //request.setAttribute("action", redirect);
            }
            else{
                session.setAttribute("error", true);
                session.setAttribute("msg", "Ha habido un error modificando el usuario");
                redirect = "doManage";
                doRedirect = true;
                //request.setAttribute("action", redirect);
            }


        } else if (userPath.equals("/doRemoveUser")) {
            // Para borrar un usuario, recogemos parametros de formulario
            String t = request.getParameter("name");
            // Miramos si existe
            Usuarios u;
            if (!t.equals("") && !t.equals("admin") && ((u = usuariosFacade.getUsuario(t)) != null)){
                // Si existe, lo borramos y mensajes y redireccion
                usuariosFacade.remove(u);
                session.setAttribute("error", false);
                session.setAttribute("msg", "Usuario eliminado con exito");
                redirect = "doManage";
                doRedirect = false;
                //request.setAttribute("action", redirect);
            }
            else{
                // Si no, mensaje de error
                session.setAttribute("error", true);
                session.setAttribute("msg", "Ha habido un error eliminando el usuario");
                redirect = "doManage";
                doRedirect = false;
                //request.setAttribute("action", redirect);
            }
        }

        // Eliminar un mensaje, solo es posible si es admin
        else if (userPath.equals("/doRemovePost")) {
            // Verificamos que hay permisos

            // Recogemos la id del mensaje por formulario
            String id = request.getParameter("cual");
            Integer i = Integer.parseInt(id);
            // Buscamos el mensaje, lo eliminaremos por ID
            Mensajes m;
            if ((i != null) && ((m = mensajesFacade.getMensaje(i))!= null)){
                // Lo eliminamos y confirmacion y redireccion
                mensajesFacade.remove(m);
                session.setAttribute("error", false);
                session.setAttribute("msg", "Mensaje eliminado correctamente");
                redirect = "doShowWall";
                // Ojo al borrar, hay que recargar??
                doRedirect = true;
                request.setAttribute("action", redirect);
            }
            else{
                // Si no, mensaje de error
                session.setAttribute("error", true);
                session.setAttribute("msg", "Ha habido un error eliminando el mensaje");
                redirect = "doShowWall";
                doRedirect = true;
                request.setAttribute("action", redirect);
            }
        }

        else if (userPath.equals("/doShowWall") ) {
            // Preparamos los mensajes
                lm = mensajesFacade.findAll();
                session.setAttribute("lm",lm);
                redirect="muro.jsp";
                doRedirect = true;
                //request.setAttribute("action", redirect);
        }

        else if (userPath.equals("/doManage")) {
            // Preparamos los usuarios
                um = usuariosFacade.findAll();
                session.setAttribute("um",um);
                redirect="gestion.jsp";
                doRedirect = true;
                //request.setAttribute("action", redirect);
        }

        if (doRedirect){
            try {
            // Reenviamos si hay que reenviar
                //request.getRequestDispatcher(redirect).forward(request, response);
                response.sendRedirect(redirect);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    protected void dispatch(HttpServletRequest request,
        HttpServletResponse response,String page)
        throws  javax.servlet.ServletException, java.io.IOException {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
        dispatcher.forward(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
